package com.suhui.task.controller;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSON;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import com.suhui.task.common.Result;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.Base64;
import java.util.List;

@RestController
@RequestMapping("/files")
public class FileController {

    // 获取端口
    @Value("${server.port}")
    private String port;

    @Value("${file.ip}")
    private String ip;

    @PostMapping("/upload")
    public Result<?> upload(@RequestParam("file")MultipartFile file){
        /**
         * 文件上传 接口
         */
        try {
            String originalFilename = file.getOriginalFilename(); //获取上传文件名称
            //定一义文件唯标识 避免 文件名重复
            String uuid = IdUtil.fastSimpleUUID(); // 借助于hutool工具 创建uuid
            String rootFilePath = System.getProperty("user.dir") + "/springboot-task/src/main/resources/files/" + uuid + "_" + originalFilename; //获取项目 目录
            FileUtil.writeBytes(file.getBytes(), rootFilePath); // 文件写入操作 借助与hutool工具
            return Result.success("http://"+ip +":"+ port +"/files/download/"+ uuid);  // 返回结果: 下载文件的 url (以uuid做唯一标识)
        } catch (IOException e) {
            return Result.error("500","文件上传失败："+e);
        }
    }

    @PostMapping("/editor/upload")
    public JSON editorUpload(MultipartFile file) throws IOException {
        /**
         * 文件上传 接口
         */
        //获取上传文件名称
        String originalFilename = file.getOriginalFilename();
        //定义文件唯一标识 避免 文件名重复
        String uuid = IdUtil.fastSimpleUUID(); // 借助于hutool工具 创建uuid
        //获取项目 目录
        String rootFilePath = System.getProperty("user.dir") + "/springboot-task/src/main/resources/files/" + uuid + "_" + originalFilename;
        FileUtil.writeBytes(file.getBytes(),rootFilePath); // 文件写入操作 借助与hutool工具
        String url = "http://"+ip +":"+ port +"/files/download/"+ uuid;
        JSONObject json = new JSONObject();
        json.set("errno", 0);
        JSONArray array = new JSONArray();
        JSONObject data = new JSONObject();
        array.add(data);
        data.set("url", url);
        data.set("alt", originalFilename);
        data.set("href", url);
        json.set("data", array);
        return json;
    }

//    @PostMapping("/editor/uploadVideo")
//    public JSON uploadVideo (MultipartFile file) {
//        JSONObject json = new JSONObject();
//        json.set("errno", 1);
//        json.set("message", "该功能未推出，敬请期待！");
//        return json;
//    }

    @GetMapping("/download/{uuid}")
    public void download( @PathVariable String uuid,HttpServletResponse response) {
        /**
         * 文件下载接口
         */
        OutputStream os;  // 创建一个输出流对象
        String basePath = System.getProperty("user.dir") + "/springboot-task/src/main/resources/files/"; // 文件的根路劲
        List<String> fileNames = FileUtil.listFileNames(basePath); // 获取 每个文件的 文件名
        String avatar = fileNames.stream().filter(name -> name.contains(uuid)).findAny().orElse(""); // 匹配 文件名找到跟参数一致的文件
        try {
            if (StrUtil.isNotEmpty(avatar)) {  // 找到了 匹配的文件
                response.addHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(avatar,"UTF-8"));
                response.setContentType("application/octet-stream");
                byte[] bytes = FileUtil.readBytes(basePath + avatar);  // 通过文件路劲 读取文件字节流
                os = response.getOutputStream();  // 通过输出流返回文件
                os.write(bytes);
                os.flush();
                os.close();
            }
        } catch (Exception e) {
            System.out.println("文件下载失败");
        }
    }

}
